use crate::commands::vx_path::path_tools::get_wechat_path_from_db;
use std::process::Command;
use std::time::Duration;
use std::{env, fs};
use serde::Serialize;

/// 微信操作返回结果结构体
///
/// 用于封装执行微信相关操作（如启动多开）的结果状态和提示信息。
#[derive(Serialize)]
pub struct Return {
    /// 状态码，表示执行结果
    ///
    /// | 状态码 | 含义 |
    /// |--------|------|
    /// | 200 | 启动成功 |
    /// | 201 | 微信已打开 |
    /// | 202 | 第一次使用微信，需要设置微信目录 |
    /// | 203 | 找不到微信，需要设置微信目录 |
    /// | 204 | 微信未打开 |
    pub(crate) code: i32,

    /// 对应状态码的文字描述信息
    pub(crate) message: String,
}

/// 启动微信多开实例
///
/// 此函数会：
/// 1. 从数据库中读取微信主程序路径。
/// 2. 检查路径是否有效（存在且为 `WeChat.exe`）。
/// 3. 在系统临时目录下创建多个独立运行目录，复制主程序到各目录中。
/// 4. 启动多个微信实例，实现多开功能。
///
///
/// # 参数
/// - `num`: 启动的微信实例数量。例如传入 `2` 则启动两个微信。
///
///
/// # 返回值
/// 返回一个 [`Return`] 结构体，包含操作状态码和描述信息。
///
/// - `Ok(Return)`：表示操作成功或提示性返回（如需设置路径）。
/// - `Err(String)`：表示操作中出现系统级错误（如文件复制或启动失败）。
///
///
/// # 状态码说明
/// | 状态码 | 含义 |
/// |--------|------|
/// | 200 | 启动成功 |
/// | 202 | 数据库中未找到路径，需首次设置 |
/// | 203 | 找不到微信可执行文件 |
///
///
/// # 异步行为
/// 本函数为异步执行：
/// - 使用 `tokio::time::sleep` 控制每个实例启动的间隔，避免系统阻塞。
/// - 使用异步数据库访问 `get_wechat_path_from_db().await`。
///
///
/// # 示例
/// ```rust
/// // 启动两个微信实例
/// let result = vx_run(2).await?;
/// println!("状态码: {}, 消息: {}", result.code, result.message);
/// ```
///
///
/// # 注意事项
/// - 本函数仅支持 Windows 平台。
/// - 复制 `WeChat.exe` 到临时目录的方式用于绕过多开限制。
/// - 临时目录位于系统 `Temp` 文件夹下（`std::env::temp_dir()`）。
/// - 每个实例对应一个独立目录（例如：`wechat_instance_0`、`wechat_instance_1`）。
///
#[tauri::command]
pub async fn vx_run(num: i32) -> Result<Return, String> {
    // 1. 从数据库读取微信路径
    let f = get_wechat_path_from_db().await;

    // 如果路径为空，则提示需要设置微信运行目录
    if f.is_none() {
        return Ok(Return {
            code: 202,
            message: "需要设置微信运行目录".to_string(),
        });
    }

    if let Some(s) = f {
        // ✅ 检查路径是否为微信主程序
        let path = std::path::Path::new(&s);

        // 文件不存在或文件名不是 WeChat.exe，则提示无效路径
        if !path.exists() || path.file_name().unwrap_or_default() != "WeChat.exe" {
            return Ok(Return {
                code: 203,
                message: "找不到微信, 需要设置正确的微信目录".to_string(),
            });
        }

        // 获取系统临时目录作为多开实例基础目录
        let base_path = env::temp_dir();

        // 根据 num 启动多个微信实例
        for i in 0..num {
            // 为每个实例创建独立的临时目录
            let instance_dir = base_path.join(format!("wechat_instance_{}", i));

            // 若目录已存在，则清理旧数据
            if instance_dir.exists() {
                let _ = fs::remove_dir_all(&instance_dir);
            }

            // 创建实例目录
            if let Err(e) = fs::create_dir_all(&instance_dir) {
                return Err(format!("创建临时目录失败: {}", e));
            }

            // 复制主程序 WeChat.exe 到临时目录
            let wechat_copy = instance_dir.join("WeChat.exe");
            if let Err(e) = fs::copy(&s, &wechat_copy) {
                return Err(format!("复制 WeChat.exe 失败: {}", e));
            }

            // 启动微信副本
            println!("启动第 {} 个微信: {}", i + 1, wechat_copy.display());
            if let Err(e) = Command::new(&wechat_copy)
                .current_dir(&instance_dir)
                .spawn()
            {
                return Err(format!("启动微信失败: {}", e));
            }

            // 每次启动间隔 500 毫秒，避免系统资源竞争
            tokio::time::sleep(Duration::from_millis(500)).await;
        }
    }

    // 所有实例启动成功
    Ok(Return {
        code: 200,
        message: "启动成功".to_string(),
    })
}
